﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;

namespace Redis实例.Controllers
{
    public class MemoryCacheController : Controller
    {
        #region 注入缓存
        private readonly IMemoryCache Cache;
        public MemoryCacheController(IMemoryCache cache)
        {
            Cache = cache;
        }
        #endregion


        /// <summary>
        /// 说到缓存我们就会想到MemoryCache 、Redis 等等其他优秀的
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            ////设置缓存  当我们没有指定过期时间，理论是永久的（后面会说到不理论的）
            //Cache.Set("key", "value");
            //Console.WriteLine(Cache.Get("key"));

            ////设置缓存绝对过期时间
            //Cache.Set("key1", "value", new DateTimeOffset(new DateTime(2020, 7, 22)));
            //Console.WriteLine(Cache.Get("key1"));

            ////设置相对过期时间
            //Cache.Set("key2", "value", new TimeSpan(0, 0, 10));
            //Console.WriteLine(Cache.Get("key2"));

            ////设置滑动过期时间
            //Cache.Set("key3", "value", new MemoryCacheEntryOptions()
            //{
            //    //设置滑动过期
            //    SlidingExpiration = new TimeSpan(0, 0, 5),
            //    //设置缓存的优先级，当我们缓存空间不足的时候会移除等级低的缓存，以此类推（清除的时候不会管是否过期）
            //    //Low,    低的意思
            //    //Normal, 正常模式  默认模式
            //    //High,   高
            //    //NeverRemove 绝不回收，这个就算内存满了也不会清除。
            //    Priority = CacheItemPriority.NeverRemove
            //});
            //Console.WriteLine(Cache.Get("key3"));

            //其他方式创建
            Cache.GetOrCreate("key4", cacheEntry =>
            {
                //设置相对过期
                cacheEntry.AbsoluteExpirationRelativeToNow = new TimeSpan(0, 0, 2);
                //设置过期回调函数
                cacheEntry.RegisterPostEvictionCallback(CallbackFunction);
                //设置内存
                return cacheEntry.Value = "滑动过期时间带回调";
            });
            Console.WriteLine(Cache.Get("key4"));
            Thread.Sleep(3000);
            Console.WriteLine(Cache.Get("key5"));


            ////CreateEntry设置缓存
            var entity = Cache.CreateEntry("key5");
            entity.Value = "5555";
            Console.WriteLine("CreateEntry 获取信息：" + Cache.Get("key5"));  //结果null

            ////方法1
            //var entity = Cache.CreateEntry("key5");
            //entity.Value = "5555";
            //entity.Dispose();
            //Console.WriteLine("CreateEntry 获取信息：" + Cache.Get("key5"));  //结果5555

            ////方法2
            //using (var entity = Cache.CreateEntry("key5"))
            //{
            //    entity.Value = "5555";
            //    Console.WriteLine("CreateEntry 获取信息：" + Cache.Get("key5"));  //结果5555
            //}
            return Json("");
        }

        /// <summary>
        /// 删除回调函数
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="reason"></param>
        /// <param name="state"></param>
        public void CallbackFunction(object key, object value, EvictionReason reason, object state)
        {
            Console.WriteLine($"你被删除了key：{key},value：{value}回调函数");
        }
    }
}